#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/2/7
# @Author: Sunny
# ========================


#第一题：基于pymysql模块实现一个数据库操作的上下文管理器（目的：实现自动关闭连接对象和游标）
import pymysql

class MySql:
    def __init__(self):
        #1.建立连接
        self.conn = pymysql.connect(host='192.168.99.113',
                                    user='bitb_dev',
                                    password='bitb_dev',
                                    db='bessky_test',
                                    port=3306,
                                    charset='utf8',
                                    cursorclass=pymysql.cursors.DictCursor)
        # 2.创建游标
        self.cursor = self.conn.cursor()


    def __enter__(self):
        # #建立连接
        return self


    def __call__(self, sql,arg=None,all_data=False):
        """
        执行sql并返回查询的数据
        :param sql: sql语句,字符类型
        :param arg: sql语句的参数，为序列类型
        :param is_more: False or True
        :return: 字典类型或者嵌套字典的列表
        """
        self.cursor.execute(sql, arg)
        self.conn.commit()
        if all_data:
            result = self.cursor.fetchall()
        else:
            result = self.cursor.fetchone()

        return result


    def __exit__(self, exc_type, exc_val, exc_tb):
        #关闭连接
        self.cursor.close()
        self.conn.close()


with MySql() as db:
    res = db("SELECT * FROM t_employee WHERE job_number = '008770'")
    print(res)





"""
第二题：自定义一个列表类型，保留列表本身就有的列表之间相加的功能，
另外再实现对象可以之间可以使用 -  来进行操作
# 要求：如果一个对象减去另一个对象，则把和被减对象中一样的数据给删除掉
# 如下：
li1 = MyList([11, 22, 33, 44])
li2 = MyList([1, 22])
res = li1 - li2
# res 打印的结果为[11,33,44]

"""
class MyList:
    def __init__(self,param):
        self.param = param

    def __sub__(self, other):
        new_list = [ i for i in self.param if i not in other.param]
        return new_list
print()
li1 = MyList([11, 22, 33, 44])
li2 = MyList([1, 22])
res = li1 - li2
print(res)




#第三题： 请描述 __new__ 、 __str__、__repr__、__call__分别在什么情况下会被触发！

"""
__new__:在创建对象时会被触发
__str__:输出到控制台的时候触发，对象被print打印的时候显示的内容是有__str__决定
__repr__:直接print(类对象)的时候触发
__call__:实例对象+()的时候会被触发，让对象可以像函数一样直接去调用
"""